home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / elist.src.archive / 000026_crash!kirk.safb.af.mil!BWILLS_Thu, 19 Aug 93 08:32:20 PST.msg < prev   
Text File  |  1993-08-31  |  4KB  |  100 lines

  1. Received: by bkhouse.cts.com (V1.16/Amiga)
  2.     id AA00000; Thu, 19 Aug 93 08:32:20 PST
  3. Received: from kirk.safb.af.mil by crash.cts.com with smtp
  4.     (Smail3.1.28.1 #15) id m0oSzLI-0000RJC; Wed, 18 Aug 93 19:03 PDT
  5. Message-Id: <m0oSzLI-0000RJC@crash.cts.com>
  6. Date: 18 Aug 93 21:00:00 CST
  7. From: "Barry D. Wills" <BWILLS@kirk.safb.af.mil>
  8. To: "amigae" <amigae@bkhouse.cts.com>
  9. Subject: BusyPointer.e (update)
  10.  
  11. /*
  12.    SetPointer() demo.  Compile and run.  Click left mouse button in window
  13.    to see the Busy Pointer.  Click the right mouse button in window to quit.
  14.  
  15.    The previous version did not free memory properly (thanks to Dave for
  16.    pointing that out!)  I made the mistaken assumption that once I gave the
  17.    image to the window the window would free the image for me.  WRONG!  You
  18.    have to hang onto the image and free it after closing the window.  In
  19.    order for it to work right some things must be considered:
  20.    1.  In order for the pointer size calculation to work, pointerImage must
  21.        be a List of INT.  Since E variables are even-byte aligned, and the
  22.        pointer data are paired, we can use CopyMemQuick().  This is a bonus,
  23.        but the gain is not significant with this small data size.
  24.    2.  If you don't open your own window, then (I think) you must go through
  25.        a lot of hassle to get a pointer to the Workbench window.  If anyone
  26.        knows differently, please let us know.
  27.    3.  You have to know a little about images in order to code them.  There
  28.        are some utils out there to capture the pointer to C source code, or
  29.        convert a brush to C source code.  You'll have to hunt for those.
  30.        (Dave, how did you do it?)  If you want a tutorial on how to construct
  31.        image data, I might could cook something up for you.  RKRMs discuss
  32.        it, but rather tersely.
  33.    4.  You must save the address returned by setPointer(), then call
  34.        freePointer() after closing the window.
  35.    5.  You can reset the pointer image to the intuition default by calling
  36.        ClearPointer(win).  If you are not closing the window, you *must* do
  37.        "ClearPointer(); freePointer()" in that order.  If you reverse the
  38.        order, your task will crash if your window is active or becomes activated
  39.        in between the calls.
  40.    Thanks again, Dave, for your replies (and for the "private data"
  41.    suggestion. :-)
  42. */
  43.  
  44. MODULE 'exec/memory'
  45. MODULE 'intuition/intuition'
  46. MODULE 'intuition/screens'
  47.  
  48. CONST SIZEOF_INT = 2
  49.  
  50. PROC setPointer (win : PTR TO window,
  51.                  pointerImage : PTR TO INT)
  52.   /* NOTE: pointerImage CAN reside in any type of MEM. */
  53.   DEF chipMem = NIL,
  54.       sizeofPointer = 0
  55.   sizeofPointer := ListLen (pointerImage) * SIZEOF_INT
  56.   IF chipMem := AllocMem (sizeofPointer + 4, MEMF_CHIP)
  57.     PutLong (chipMem, sizeofPointer)
  58.     chipMem := chipMem + 4
  59.     CopyMemQuick (pointerImage, chipMem, sizeofPointer)
  60.     SetPointer (win, chipMem, 16, 16, -6, 0)
  61.   ENDIF
  62. ENDPROC  chipMem
  63.  
  64. PROC freePointer (pointerImage : PTR TO INT)
  65.   pointerImage := pointerImage - 4
  66.   FreeMem (pointerImage, ^pointerImage + 4)
  67. ENDPROC
  68.  
  69. PROC main ()
  70.   DEF myWin           = NIL,
  71.       busyPointerData = NIL : PTR TO INT,
  72.       busyPointer     = NIL
  73.   IF myWin := OpenW (20, 20, 100, 100, 0, 0,
  74.                      'BusyPointer', NIL, WBENCHSCREEN, NIL)
  75.     busyPointerData := [$0000, $0000,  /* Reserved, must be NULL */
  76.                         $0400, $07c0,
  77.                         $0000, $07c0,
  78.                         $0100, $0380,
  79.                         $0000, $07e0,
  80.                         $07c0, $1ff8,
  81.                         $1ff0, $3fec,
  82.                         $3ff8, $7fde,
  83.                         $3ff8, $7fbe,
  84.                         $7ffc, $ff7f,
  85.                         $7efc, $ffff,
  86.                         $7ffc, $ffff,
  87.                         $3ff8, $7ffe,
  88.                         $3ff8, $7ffe,
  89.                         $1ff0, $3ffc,
  90.                         $07c0, $1ff8,
  91.                         $0000, $07e0,
  92.                         $0000, $0000] : INT  /* Reserved, must be NULL */
  93.     busyPointer := setPointer (myWin, busyPointerData)
  94.     WHILE Mouse () <> 2 DO WaitTOF ()
  95.     CloseW (myWin)
  96.     freePointer (busyPointer)
  97.   ENDIF
  98. ENDPROC
  99.  
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%